// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/views/controls/button/button.h"

#include "base/strings/utf_string_conversions.h"
#include "ui/accessibility/ax_view_state.h"

namespace views {

////////////////////////////////////////////////////////////////////////////////
// Button, static public:

// static
Button::ButtonState Button::GetButtonStateFrom(ui::NativeTheme::State state)
{
    switch (state) {
    case ui::NativeTheme::kDisabled:
        return Button::STATE_DISABLED;
    case ui::NativeTheme::kHovered:
        return Button::STATE_HOVERED;
    case ui::NativeTheme::kNormal:
        return Button::STATE_NORMAL;
    case ui::NativeTheme::kPressed:
        return Button::STATE_PRESSED;
    case ui::NativeTheme::kNumStates:
        NOTREACHED();
    }
    return Button::STATE_NORMAL;
}

////////////////////////////////////////////////////////////////////////////////
// Button, public:

Button::~Button()
{
}

void Button::SetTooltipText(const base::string16& tooltip_text)
{
    tooltip_text_ = tooltip_text;
    if (accessible_name_.empty())
        accessible_name_ = tooltip_text_;
    TooltipTextChanged();
}

void Button::SetAccessibleName(const base::string16& name)
{
    accessible_name_ = name;
}

////////////////////////////////////////////////////////////////////////////////
// Button, View overrides:

bool Button::GetTooltipText(const gfx::Point& p,
    base::string16* tooltip) const
{
    if (tooltip_text_.empty())
        return false;

    *tooltip = tooltip_text_;
    return true;
}

void Button::GetAccessibleState(ui::AXViewState* state)
{
    state->role = ui::AX_ROLE_BUTTON;
    state->name = accessible_name_;
}

////////////////////////////////////////////////////////////////////////////////
// Button, protected:

Button::Button(ButtonListener* listener)
    : listener_(listener)
    , tag_(-1)
{
    SetAccessibilityFocusable(true);
}

void Button::NotifyClick(const ui::Event& event)
{
    // We can be called when there is no listener, in cases like double clicks on
    // menu buttons etc.
    if (listener_)
        listener_->ButtonPressed(this, event);
}

void Button::OnClickCanceled(const ui::Event& event) { }

} // namespace views
